#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
信号连接管理模块
负责连接UI组件的信号与相应的处理槽函数
"""

from PySide6.QtCore import Qt


class SignalConnector:
    """信号连接管理类"""
    
    def __init__(self):
        """初始化信号连接管理器"""
        pass
    
    def connect_signals(self, window):
        """
        连接信号和槽
        
        将UI组件的信号与相应的处理槽函数连接起来，包括：
        1. 按钮点击信号 - 连接到对应的处理方法
        2. 滑块操作信号 - 连接到进度控制方法
        3. 模式选择信号 - 连接到模式切换方法
        4. 定时器超时信号 - 连接到帧更新方法
        
        Args:
            window (VideoStitcherMainWindow): 主窗口实例
            
        Note:
            - 所有按钮的clicked信号都连接到对应的处理方法
            - 滑块的sliderPressed、sliderReleased和valueChanged信号分别连接到不同的处理方法
            - 模式选择按钮组的buttonClicked信号连接到change_mark_mode方法
            - 定时器的timeout信号连接到update_frame方法，用于视频播放时的帧更新
        """
        # 按钮信号连接
        window.import_button.clicked.connect(window.import_video)
        window.switch_video_button.clicked.connect(window.switch_video)
        window.play_pause_button.clicked.connect(window.toggle_play_pause)
        window.skip_to_start_button.clicked.connect(window.skip_to_start)
        window.step_backward_button.clicked.connect(window.step_backward)
        window.step_forward_button.clicked.connect(window.step_forward)
        window.skip_to_end_button.clicked.connect(window.skip_to_end)
        window.mark_in_button.clicked.connect(window.mark_in_point)
        window.mark_out_button.clicked.connect(window.mark_out_point)
        window.export_button.clicked.connect(window.export_video)
        window.delete_segment_button.clicked.connect(window.delete_selected_segment)
        window.clear_segments_button.clicked.connect(window.clear_all_segments)
        
        # 滑块信号连接
        window.progress_slider.sliderPressed.connect(window.on_slider_pressed)
        window.progress_slider.sliderReleased.connect(window.on_slider_released)
        window.progress_slider.valueChanged.connect(window.on_slider_value_changed)
        
        # 模式选择信号连接
        window.mode_button_group.buttonClicked.connect(window.change_mark_mode)
        
        # FFmpeg播放器信号连接
        window.ffmpeg_player.frame_ready.connect(
            lambda qimage: window.frame_handler.display_frame(window, qimage)
        )
        window.ffmpeg_player.position_changed.connect(
            lambda position: window.frame_handler.update_position(window, position)
        )
        window.ffmpeg_player.playback_finished.connect(
            lambda: window.frame_handler.handle_playback_finished(window)
        )
        window.ffmpeg_player.error_occurred.connect(
            lambda error: print(f"FFmpeg播放器错误: {error}")
        )